package com.kerrykidz.system.util.quartz;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.kerrykidz.common.Constants;
import com.kerrykidz.common.service.ICommonService;
import com.kerrykidz.sms.util.SmsTask;
import com.kerrykidz.system.dao.model.KdeBatchEntity;
import com.kerrykidz.system.dao.model.KdeVoucherEntEntity;
import com.kerrykidz.system.dao.model.KdeVoucherRecEntity;
import com.kerrykidz.system.dao.model.SysParaEntity;
import com.kerrykidz.system.service.IK3Service;
import com.kerrykidz.system.util.DateUtil;
import com.rdp.framework.exception.RDPException;
import com.rdp.util.config.SpringUtil;
import com.rdp.util.io.FileUtil;

public class K3Task extends QuartzJobBean{
	private Logger logger = Logger.getLogger(SmsTask.class); 
	
	
	/**
	 * k3    金蝶数据库暂无 为实现数据同步内容 
	 */
	@Override
	protected void executeInternal(JobExecutionContext context)throws JobExecutionException {
		IK3Service k3Service = (IK3Service) SpringUtil.getBean("k3ServiceImpl");
		JdbcTemplate jdbcTemplate = (JdbcTemplate) SpringUtil.getBean("jdbcTemplateK3");
		ICommonService commonService = (ICommonService)SpringUtil.getBean("CommonServiceImpl");
		SysParaEntity paraEntity = commonService.findSysParaById(Constants.SYS_BASE_PATH_K3);
		
		String filePath = paraEntity.getParaValue() ;
		StringBuffer logBatFile = new StringBuffer();
		
		KdeBatchEntity k3param = new KdeBatchEntity();
		k3param.setSyncStatus("2,4");
		List<KdeBatchEntity> k3List;
		try {
			k3List = k3Service.getKdeBatchListWhere(k3param);
			if(k3List != null && k3List.size() > 0){
				
				for(KdeBatchEntity k3Bat : k3List){
					
					//记录日志文件
					String batFileName = filePath + File.separator +k3Bat.getPkKdebtId()+".log";
					logFile(logBatFile,"批次ID" ,k3Bat.getPkKdebtId() , true);
					
					/**处理批次 并且  修改状态  正在处理中*/
					k3Bat.setSyncStatus("3");
					if(k3Bat.getSyncDate() == null){
						k3Bat.setSyncDate(new Date());
					}
					k3Bat.setLastSync(new Date());
					k3Bat.setTrialCnt(k3Bat.getTrialCnt() + 1);
					try {
						k3Service.updateKdeBatchEntity(k3Bat);
					} catch (RDPException e1) {
						logFile(logBatFile,"处理批次 - 修改状态失败 - 正在处理中 - 异常" ,k3Bat.getPkKdebtId() , true);
						logger.error("处理批次 - 修改状态失败 - 正在处理中  异常 ：" + e1.getMessage());
						continue;
					}
					
					
					
					/*对接金蝶系统    对接凭证记录表*/
					logFile(logBatFile,"######################对接凭证记录表######################" ,DateUtil.getNow() , true);
					boolean flagRec = k3VoucherRecSynchro(k3Service, k3Bat , logBatFile);
					logFile(logBatFile,"######################对接凭证记录表内容完成######################" ,flagRec , true);
					
					/*对接金蝶系统    对接记录凭证分录*/
					logFile(logBatFile,"######################对接记录凭证分录######################" ,DateUtil.getNow() , true);
					boolean flagEnt = k3VoucherEntSynchro(k3Service, k3Bat, logBatFile);
					logFile(logBatFile,"######################对接记录凭证分录######################" ,flagRec , true);
					
					/**处理完成*/
					if(flagRec && flagEnt){
						k3Bat.setSyncStatus("4");
					}else{
						k3Bat.setSyncStatus("5");
					}
					try {
						k3Service.updateKdeBatchEntity(k3Bat);
					} catch (RDPException e) {
						logFile(logBatFile,"处理批次 - 修改状态失败 - 处理完成 - 异常 : " ,k3Bat.getPkKdebtId() , true);
						logger.error("处理批次 - 修改状态失败 - 处理完成 -  异常 ：" + e.getMessage());
					}
					
					/*记录备案*/
					FileUtil.write(new File(batFileName), logBatFile.toString());
					logBatFile.setLength(0);
				}
			}
		} catch (RDPException e2) {
			logger.error("K3 获取批次出现异常 ：" + e2.getMessage());
		}
		
	}
	
	/**
	 * 1、获取   对接凭证记录
	 * 2、插入  k3 金蝶系统   
	 * 3、修改对接记录状态
	 * 
	 * 返回结果为  true  表示全部同步成功  否则  部分失败 false
	 * */
	private boolean k3VoucherRecSynchro(IK3Service k3Service, KdeBatchEntity k3Bat, StringBuffer sb){
		/*处理过程中是否发生异常*/
		boolean flag = true;
		//1
		KdeVoucherRecEntity recEntity = new KdeVoucherRecEntity();
		recEntity.setFkKdebtId(k3Bat.getPkKdebtId());
		List<Map<String, Object>> recList;
		try {
			recList = k3Service.findK3RecSynchronousData(recEntity);
			if(recList != null && recList.size() > 0){
				logFile(sb,"处理批次 - 对接凭证记录 - 处理数据记录数 : " ,recList.size() , true);
				
				for(Map<String,Object> recMap : recList){
					
					/*设置必要修改参数*/
					int k3FvoucherId = Integer.valueOf(recMap.get("K3_FVOUCHERID").toString());
					String status = "";
					
					//2 ？？ 未实现    如果插入金蝶系统失败  状态为失败表示 0  否则 为1
					try{
						//插入金蝶
						status = "1";
					}catch(Exception e){
						flag = false;
						status = "0";
						logFile(sb,"处理批次 - 对接凭证记录- 对接K3金蝶异常  - 出错数据内容 : " ,recMap , true);
						logFile(sb,"处理批次 - 对接凭证记录 - 对接K3金蝶异常 : " ,e.getMessage() , true);
						logger.error("k3 对接凭证记录 对接  金蝶发送异常  " + e.getMessage());
					}
					
					//3 修改本地对接记录三个字段 KDE_VOUCHER_REC： SYNC_TIME 、 SYNC_STATUS 、 SYNC_RESULT
					recEntity.setK3FvoucherId(k3FvoucherId);
					recEntity.setSyncTime(new Date());
					recEntity.setSyncResult(status);
					k3Service.updateKdeVoucherRecEntity(recEntity);
				}
			}
		} catch (RDPException e1) {
			logFile(sb,"处理批次 - 对接凭证记录 -  异常 : " ,k3Bat.getPkKdebtId() , true);
			logger.error("处理批次 - 对接凭证记录 - 异常 ：" + e1.getMessage());
		}
		return flag;
	}
	
	/**
	 * 1、 获取借贷数据
	 * 2、将数据  同步到  金蝶系统    如果同步失败状态为0  否则为1
	 * 3、修改借贷同步状态  
	 */
	public boolean k3VoucherEntSynchro(IK3Service k3Service, KdeBatchEntity k3Bat, StringBuffer sb){
		boolean flag = true;
		KdeVoucherEntEntity entEntity = new KdeVoucherEntEntity();
		entEntity.setFkKdebtId(k3Bat.getPkKdebtId());
		
		//1
		List<Map<String, Object>> entList;
		try {
			entList = k3Service.findK3EntSynchronousData(entEntity);
			if(entList != null && entList.size() > 0){
				logFile(sb,"处理批次 - 获取借贷数据  - 处理数据记录数 : " ,entList.size() , true);
				
				for(Map<String,Object> entMap : entList){
					int enttryId = Integer.valueOf(entMap.get("K3_FENTRY_ID").toString());
					String status = "0";
					
					//2
					try{
						//插入金蝶
						
						status = "1";
					}catch(Exception e){
						flag = false;
						logFile(sb,"处理批次 - 获取借贷数据 - 对接K3金蝶异常 : " ,e.getMessage() , true);
						logFile(sb,"处理批次 - 获取借贷数据 - 对接K3金蝶异常  - 出错数据内容 : " ,entMap , true);
						logger.error("k3 获取借贷数据  对接  金蝶发送异常" + e.getMessage());
					}
					
					//3
					entEntity.setK3FentryId(enttryId);
					entEntity.setResultStatus(status);
					k3Service.updateBatchKdeVoucherEntEntity(entEntity);
				}
			}
		} catch (RDPException e1) {
			logFile(sb,"处理批次 - 获取借贷数据 -  异常 : " ,k3Bat.getPkKdebtId() , true);
			logger.error("处理批次 - 获取借贷数据 - 异常 ：" + e1.getMessage());
		}
		return flag;
	}
	
	private void logFile(StringBuffer sb ,String key , Object context, boolean flag){
		sb.append(key);
		sb.append(":");
		sb.append(context.toString());
		sb.append("\n");
	}
	
	
}
